﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;


using System.Data;
using System.Data.SqlClient;
using AdminCondominio.Dominio;
namespace AdminCondominio.Persistencia
{
	public class ViviendaDAO
	{

        private SqlConnection _cn = null;

        public ViviendaDAO()
        {
            
            //_cn = new SqlConnection(@"Data Source=localhost;Initial Catalog=BdCondominio;Persist Security Info=True;User ID=sa;Password=");
            _cn = new SqlConnection(@"Data Source=localhost;Initial Catalog=BdCondominio;Persist Security Info=True;User ID=sa;Password=");

           // _cn = new SqlConnection(@"Data Source=(local);Initial Catalog=BdCondominio;Integrated Security=True");

        }

        public int InsertVivienda(Dominio.Vivienda value)
        {
            try
            {
                Vivienda viviendaExistente = this.ObtenerVivienda(value.CoVivienda);
                if (viviendaExistente != null)
                {
                    throw new Exception("El Número de Vivienda " + value.CoVivienda + " ya existe");
                }else{
                     if (value.NuVivienda==0 ){
                         throw new Exception("Ingrese Número de Vivienda ");
                     }else{

                    SqlCommand _cmd = new SqlCommand();
                                    _cmd.CommandType = CommandType.Text;
                                    _cmd.Connection = _cn;
                                    _cmd.CommandText = @"INSERT INTO vivienda VALUES(@codResidente,@ubicacion,@numvivienda,@metraje,@tipovivienda)";
                                    _cmd.Parameters.Add("@codResidente", SqlDbType.Int, 20).Value = value.Residente.CoResidente;
                                    _cmd.Parameters.Add("@ubicacion", SqlDbType.VarChar, 50).Value = value.Ubicacion;
                                    _cmd.Parameters.Add("@numvivienda", SqlDbType.Int, 20).Value = value.NuVivienda;
                                    _cmd.Parameters.Add("@metraje", SqlDbType.VarChar, 20).Value = value.TxMetraje;
                                    _cmd.Parameters.Add("@tipovivienda", SqlDbType.VarChar, 20).Value = value.TiVivienda;
                                    _cmd.Connection.Open();

                                    int fila = _cmd.ExecuteNonQuery();
                                    _cmd.Connection.Close();
                                    _cmd.Dispose();
                                    return fila;
                     }
                
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

        public Vivienda InsertVivienda1(Dominio.Vivienda value)
        {
           
                Vivienda viviendaExistente = this.ObtenerVivienda(value.CoVivienda);
                if (viviendaExistente != null)
                    throw new Exception("El Número de Vivienda " + value.CoVivienda + " ya existe");
                 if (value.NuVivienda == 0 )   
                        throw new Exception("Ingrese Número de Vivienda ");
                if (String.Empty.Equals(value.Ubicacion))
                    throw new Exception("Ingrese ubicación de la vivienda");
                 Vivienda numVivienda = this.ObtenerNumVivienda(value.NuVivienda);
                if (numVivienda!=null)
                    throw new Exception("El Número de Vivienda ya tiene propietario " + value.NuVivienda );

                        SqlCommand _cmd = new SqlCommand();
                        _cmd.CommandType = CommandType.Text;
                        _cmd.Connection = _cn;
                        _cmd.CommandText = @"INSERT INTO vivienda VALUES(@codResidente,@ubicacion,@numvivienda,@metraje,@tipovivienda)";
                        _cmd.Parameters.Add("@codResidente", SqlDbType.Int, 20).Value = value.Residente.CoResidente;
                        _cmd.Parameters.Add("@ubicacion", SqlDbType.VarChar, 50).Value = value.Ubicacion;
                        _cmd.Parameters.Add("@numvivienda", SqlDbType.Int, 20).Value = value.NuVivienda;
                        _cmd.Parameters.Add("@metraje", SqlDbType.VarChar, 20).Value = value.TxMetraje;
                        _cmd.Parameters.Add("@tipovivienda", SqlDbType.VarChar, 20).Value = value.TiVivienda;
                        _cmd.Connection.Open();

                        _cmd.ExecuteNonQuery();
                        _cmd.Connection.Close();
                        _cmd.Dispose();
                        Vivienda viviendaCreado = this.ObtenerVivienda(value.CoVivienda);
                        return viviendaCreado;                                                              

             
        }
      
        public Vivienda ObtenerVivienda(int codigo)
        {

            Vivienda _vivienda = null;       
            String cad = "select covivienda, VI.coresidente,Ubicacion,NuVivienda,TxMetraje,TiVivienda,RE.NoResidente from vivienda VI INNER JOIN residente RE ON RE.CoResidente=VI.CoResidente where CoVivienda=@codigo";
            SqlCommand _cmd = new SqlCommand(cad, _cn);
            _cmd.CommandType = CommandType.Text;
            _cmd.Parameters.Add("@codigo", SqlDbType.Int).Value = codigo;
            _cmd.Connection.Open();
            SqlDataReader filtro = _cmd.ExecuteReader();
            if (filtro.HasRows)
            {
                _vivienda = new Vivienda();

                filtro.Read();

                _vivienda.CoVivienda = (int)filtro["covivienda"];
                _vivienda.Residente = new Residente();
                _vivienda.Residente.CoResidente = (int)filtro["coresidente"];
                _vivienda.Ubicacion = (String)filtro["Ubicacion"];
                _vivienda.NuVivienda = (int)filtro["NuVivienda"];
                _vivienda.TxMetraje = (String)filtro["TxMetraje"];
                _vivienda.TiVivienda = (String)filtro["TiVivienda"];
                _vivienda.Residente.NoResidente = (String)filtro[6];
            }
            _cmd.Connection.Close();
            return _vivienda;
        }

        public Vivienda ModificarVivienda(Vivienda data)
        {
            SqlCommand _cmd = new SqlCommand();
            _cmd.CommandType = CommandType.Text;
            _cmd.Connection = _cn;
            _cmd.Connection.Close();
            _cmd.CommandText = "update vivienda set CoResidente=@codResidente,Ubicacion=@ubicacion,NuVivienda=@numvivienda,TxMetraje=@metraje,TiVivienda=@tipovivienda where CoVivienda=@codvivienda";
            _cmd.Parameters.Add("@codResidente", SqlDbType.Int, 20).Value = data.Residente.CoResidente;
            _cmd.Parameters.Add("@ubicacion", SqlDbType.VarChar, 50).Value = data.Ubicacion;
            _cmd.Parameters.Add("@numvivienda", SqlDbType.Int, 20).Value = data.NuVivienda;
            _cmd.Parameters.Add("@metraje", SqlDbType.VarChar, 20).Value = data.TxMetraje;
            _cmd.Parameters.Add("@tipovivienda", SqlDbType.VarChar, 20).Value = data.TiVivienda;
            _cmd.Parameters.Add("@codvivienda", SqlDbType.Int, 20).Value = data.CoVivienda;
          
            if (_cmd.Connection.State== ConnectionState.Open)
            {
                _cmd.Connection.Close();
            }
            _cmd.Connection.Open();
            _cmd.ExecuteNonQuery();
            _cmd.Connection.Close();

            Vivienda viviendaObtener;
            viviendaObtener = ObtenerVivienda(data.CoVivienda);
            return viviendaObtener;

        }

        public List<Vivienda> ListarVivienda(String numidentidad)
        {
            _cn.Open();
            String _Sentencia = @"select noresidente, nudocumento, ubicacion, NuVivienda, TxMetraje, TiVivienda from vivienda v, residente r where v.CoResidente=r.CoResidente and r.nudocumento="+numidentidad;
            SqlCommand _cmd = new SqlCommand(_Sentencia, _cn);
            _cmd.CommandType = CommandType.Text;
            SqlDataReader resultado = _cmd.ExecuteReader();
            List<Vivienda> _LisVivienda = new List<Vivienda>();

            while (resultado.Read())
            {
                Vivienda _Item = new Vivienda();
                _Item.Residente = new Residente();

                _Item.Residente.NoResidente = resultado.IsDBNull(0) ? string.Empty : resultado.GetString(0);
                _Item.Residente.NuDocumento = resultado.IsDBNull(1) ? string.Empty : resultado.GetString(1);
                _Item.Ubicacion = resultado.IsDBNull(2) ? string.Empty : resultado.GetString(2);
                _Item.NuVivienda = resultado.IsDBNull(3) ? 0 : resultado.GetInt32(3);
                _Item.TxMetraje = resultado.IsDBNull(4) ? string.Empty : resultado.GetString(4);
                _Item.TiVivienda = resultado.IsDBNull(5) ? string.Empty : resultado.GetString(5);
                _LisVivienda.Add(_Item);
            }
            _cn.Close();

            return _LisVivienda;


        }

        public List<Vivienda> ListarViviendaTodo()
        {
            String _Sentencia = @"select * from vivienda";
          
            SqlCommand _cmd = new SqlCommand(_Sentencia, _cn);
            _cmd.CommandType = CommandType.Text;
 
            _cmd.Connection.Open();
            SqlDataReader resultado = _cmd.ExecuteReader();
            List<Vivienda> _LisVivienda = new List<Vivienda>();

            while (resultado.Read())
            {
                Vivienda _Item = new Vivienda();
                _Item.Residente = new Residente();
                _Item.CoVivienda = resultado.IsDBNull(0) ? 0 : resultado.GetInt32(0);
                _Item.Residente.CoResidente = resultado.IsDBNull(1) ? 0 : resultado.GetInt32(1);
                _Item.Ubicacion = resultado.IsDBNull(2) ? string.Empty : resultado.GetString(2);
                _Item.NuVivienda = resultado.IsDBNull(3) ? 0 : resultado.GetInt32(3);
                _Item.TxMetraje = resultado.IsDBNull(4) ? string.Empty : resultado.GetString(4);
                _Item.TiVivienda = resultado.IsDBNull(5) ? string.Empty : resultado.GetString(5);
                _LisVivienda.Add(_Item);
            }
            _cmd.Connection.Close();

            return _LisVivienda;


        }

        public Vivienda ObtenerNumVivienda(int numVivienda)
        {
            Vivienda _vivienda = null;
            String cad = "select covivienda, coresidente, NuVivienda from vivienda where NuVivienda=@numVivienda";
            SqlCommand _cmd = new SqlCommand(cad, _cn);
            _cmd.CommandType = CommandType.Text;
            _cmd.Parameters.Add("@numVivienda", SqlDbType.Int).Value = numVivienda;
            _cmd.Connection.Open();
            SqlDataReader filtro = _cmd.ExecuteReader();
            if (filtro.HasRows)
            {
                _vivienda = new Vivienda();
                filtro.Read();
                _vivienda.CoVivienda = (int)filtro["covivienda"];
                _vivienda.Residente = new Residente();
                _vivienda.Residente.CoResidente = (int)filtro["coresidente"];
                _vivienda.NuVivienda = (int)filtro["NuVivienda"];
            }
           
            _cmd.Connection.Close();
            return _vivienda;
        }

       
	}
}